<?php

//require_once 'constants.php';

/**
 * Provides a wrapper for Paypal Direct Payment API.
 * 
 */
class PayPalNVPService {

	/**
	 * 
	 * Add $errorNo & $errorMsg into $resArray
	 * 
	 * @param $errorNo
	 * @param $errorMsg
	 * @param $resArray
	 * @return $resArray added Error No & Error Msg
	 */
	function APIError($errorNo, $errorMsg, $resArray){
        $resArray['Error']['No']=$errorNo;
        $resArray['Error']['Msg']=$errorMsg;
        
        return $resArray;
    } 
       
	/**
	 * hash_call: Function to perform the API call to PayPal using API signature
	 * @methodName is name of API  method.
	 * @nvpStr is nvp string.
	 * returns an associtive array containing the response from the server.
	 */
	function hash_call($methodName, $nvpStr)
	{
		$API_UserName=API_USERNAME;
		$API_Password=API_PASSWORD;
		$API_Signature=API_SIGNATURE;
		$API_Endpoint =API_ENDPOINT;
		$version=VERSION;
		
		//setting the curl parameters.
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL,$API_Endpoint);
		curl_setopt($ch, CURLOPT_VERBOSE, 1);

		//turning off the server and peer verification(TrustManager Concept).
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
		curl_setopt($ch, CURLOPT_POST, 1);
		//if USE_PROXY constant set to TRUE in Constants.php, then only proxy will be enabled.
		//Set proxy name to PROXY_HOST and port number to PROXY_PORT in constants.php
		if(USE_PROXY) {
			curl_setopt ($ch, CURLOPT_PROXY, PROXY_HOST.":".PROXY_PORT);
		}

		//NVPRequest for submitting to server
		$nvpreq = 	"METHOD=".urlencode($methodName).
					"&VERSION=".urlencode($version).
					"&PWD=".urlencode($API_Password).
					"&USER=".urlencode($API_UserName).
					"&SIGNATURE=".urlencode($API_Signature).$nvpStr;

		//setting the nvpreq as POST FIELD to curl
		curl_setopt($ch,CURLOPT_POSTFIELDS,$nvpreq);

		//getting response from server
		$response = curl_exec($ch);

		//convrting NVPResponse to an Associative Array
		$nvpResArray=$this->deformatNVP($response);
		$nvpReqArray=$this->deformatNVP($nvpreq);

		if (curl_errno($ch)) {
            $nvpResArray = $this->APIError(curl_errno($ch),curl_error($ch),$nvpResArray); 
			
		} else {
			//closing the curl
			curl_close($ch);
			
		}

		return $nvpResArray;
	}

	/** This function will take NVPString and convert it to an Associative Array and it will decode the response.
	 * It is usefull to search for a particular key and displaying arrays.
	 * @nvpstr is NVPString.
	 * @nvpArray is Associative Array.
	 */
	function deformatNVP($nvpstr)
	{
		$intial=0;
		$nvpArray = array();
		while(strlen($nvpstr)){
			//postion of Key
			$keypos= strpos($nvpstr,'=');
			//position of value
			$valuepos = strpos($nvpstr,'&') ? strpos($nvpstr,'&'): strlen($nvpstr);

			/*getting the Key and Value values and storing in a Associative Array*/
			$keyval=substr($nvpstr,$intial,$keypos);
			$valval=substr($nvpstr,$keypos+1,$valuepos-$keypos-1);
			//decoding the respose
			$nvpArray[urldecode($keyval)] =urldecode( $valval);
			$nvpstr=substr($nvpstr,$valuepos+1,strlen($nvpstr));
		}
		return $nvpArray;
	}

	function getIPNEndPoint() {
		return IPN_ENDPOINT;
		
	}
	
}